#-------------------------------------------------------------------------------
# Name:        module1
# Purpose:
#
# Author:      Maxime
#
# Created:     09/11/2019
# Copyright:   (c) Maxime 2019
# Licence:     <your licence>
#-------------------------------------------------------------------------------

def main():
    pass

if __name__ == '__main__':
    main()
from random import* # on aura besoin d'aléatoire...
from matplotlib import*
from numpy import*


# on affecte toutes les variables utiles par la suite...

DOSSIER=str(input('Quel est le dossier de travail(chemin complet)?'))
import os
os.chdir(DOSSIER)


Village=[] # le village
Villageniteurs=[] #le nouveau village en fin de selection des reproducteurs
RESULTATS=[] #résultats à remplir sous forme d'une liste de Nbgeneration listes
#à 6 listes de deux éléments, les deux allèles
Nbgenerations=int(input('Sur combien de générations voulez vous travailler?'))
 # on trvaillera d'abord sur x générations
eff=int(input('Quel est l effectif initial de la population?'))
 # on trvaillera d'abord sur x générations
va1=10
va2=10
va3=10
Vs=10
choix=(input('Voulez vous faire entrer en jeu la sélection naturelle?\(oui ou non\)'))
if choix=='oui':
    va1=float(input('Quel est la valeur sélective de l\'allèle a?\(entier de 0 à 10\)'))
    va2=float(input('Quel est la valeur sélective de l\'allèle b?\(entier de 0 à 10\)'))
    va3=float(input('Quel est la valeur sélective de l\'allèle c?\(entier de 0 à 10\)'))
lista1=[] #pour générer les listes vides
lista2=[] #de chaque allèle à remplir ensuite au cours des générations
lista3=[]
GEN=[] # idem pour les abscisses générations du graph

#on définit les fonctions permettant, les choix des 4 reprod parmi les 6 ind,
# la génèse de la nouvelle génération à partir des 4 reproducteurs,
# le traitement des données obtenus au bout de x générations pour obtenir des listes
# la mise en fichier csv afin de pouvoir l'exploiter en tableur.

def creationvillage(effectif):   #fonctionne
    for i in range (eff): #création des couples d'allèles des villageois
        temp=randint(0,2) # allèle n°1
        if temp==0:
            a='a1'
            va=va1
        elif temp==1:
            a='a2'
            va=va2
        elif temp==2:
            a='a3'
            va=va3
        temp=randint(0,2) # allèle n°1
        if temp==0:
            b='a1'
            vb=va1
        elif temp==1:
            b='a2'
            vb=va2
        elif temp==2:
            b='a3'
            vb=va3
        Vs=(va+vb)/2
        Village.append([Vs,a,b])#couple d'allèle et valeur sélective correspond à un villageois

    return Village

def VS(M):
    return M[0]

def choixreprod(Village): # tourne en fonction du village initial
    Villagetrie=sorted(Village, key=VS, reverse=True)# tri du village par ordre décroissant des Vs
    fin=int((len(Villagetrie))*2/3)
    if fin%2==0: # pour avoir un nombre pair de reproducteur
        fin=fin
    else:
        fin=fin+1
    Villageniteurs=Villagetrie[0:fin] # retire le tiers moins compétitif
    print('les repro sont', Villageniteurs)
    return Villageniteurs


def choixDesCouples(Reproducteurs): # pour créer une liste de couples côte à côte
    VRepro=Reproducteurs #création de la liste de travail
    eff=len(Reproducteurs) #obtention de l'effectif
    ReproOrdonnes=[] # création de la future liste recherchée
    while len(VRepro) !=0: # tant qu'il reste des éléments dans la liste
        for j in range(2): # on fait des couples de deux
            iRepro=randint(0,len(VRepro))
            ReproOrdonnes.append(VRepro[iRepro-1]) # on remplie la liste au fur et à mesure
            del VRepro[iRepro-1] # on élimine les repro déjà utilisés

    return ReproOrdonnes


def cyclederpro(ReproOrdonnes): #fonctionne mais pas adapaté
    VillageDesEnfants=[]
    for par in range (0,len(ReproOrdonnes),2):
        for co in range(3): #3 boucles pour 3 enfants
            a=randint(1,2)
            allele1=ReproOrdonnes[par][a] # enfants du couple 1 du village
            a=randint(1,2)
            allele2=ReproOrdonnes[par+1][a]

            if allele1=='a1':
                va=va1
            elif allele1=='a2':
                va=va2
            elif allele1=='a3':
                va=va3
            if allele2=='a1':
                vb=va1
            elif allele2=='a2':
                vb=va2
            elif allele2=='a3':
                vb=va3
            Vs=(va+vb)/2

            Enf=[Vs,allele1,allele2]
            VillageDesEnfants.append(Enf)
    return VillageDesEnfants

def traitementresultats(RESULTATS):
    for G in range (0, Nbgenerations):
        a1=0
        a2=0
        a3=0
        for g in range(0,eff-1):
            for a in range(1,3):
                #print('{}{}{}{}'.format(RESULTATS[G][g][a],a1,a2,a3)) #test
                if RESULTATS[G][g][a]=='a1':
                    a1=a1+1
                elif RESULTATS[G][g][a]=='a2':
                    a2=a2+1
                elif RESULTATS[G][g][a]=='a3':
                    a3=a3+1

        a1=int(a1/(eff*2)*100) # on convertit en pourcentage(entier sinon ça fait
        # des points non lisibles par calc comme nombre à virgule...
        a2=int(a2/(eff*2)*100)
        a3=int(a3/(eff*2)*100)
        #print (a1, a2, a3, G) # test pour voir l'évolution en temps réel

        lista1.append(a1) #pour générer les listes de quantité
        lista2.append(a2) #de chaque allèle au cours des générations associé à la génération
        lista3.append(a3)
        GEN.append(G)
    return lista1, lista2, lista3, GEN

def miseenfichiercsv(lista1, lista2, lista3, GEN):
    f=open('dérive.csv', 'w') # lien vers un fichier on l’affecte la variable f
    f.close()
    f=open('dérive.csv', 'a') # lien vers un fichier on l’affecte la variable f
    lista1=str(lista1)
    lista2=str(lista2)
    lista3=str(lista3)
    X=str(GEN)
    f.write('frequence_allele_a1 de VS=')
    f.write(lista1)
    f.write('\n') # permet de séparer les lignes dans le csv, à la ligne
    f.write('frequence_allele_a2 de VS=')
    f.write(lista2)
    f.write('\n')
    f.write('frequence_allele_a3 de VS=')
    f.write(lista3)
    f.write('\n')
    f.write('Générations')
    f.write(X)
    f.close()

import numpy as np
import matplotlib.pyplot as plt
def graph(X,Y1,Y2,Y3):
    fig=plt.figure() #génère un fichier graphique
    plt.plot(X, Y1 , color="blue", linewidth=1.5, linestyle="-") #crée le graphique avec des caractéristiques voulues
    plt.plot(X, Y2 , color="green", linewidth=1.5, linestyle="-")
    plt.plot(X, Y3 , color="red", linewidth=1.5, linestyle="-")
    plt.show() #montre le graphique graph(300) #lance la fonction


#lancement de la procédure:

#au début, création aléatoire du village
nouveauVillage=creationvillage(eff)
print('Vinitial:',nouveauVillage)

#boucles de Nbgenerations tours =

for ng in range(Nbgenerations):
    reproducteurs=choixreprod(nouveauVillage) # on attribue à V la liste des nouveaux reprodcuteurs
    print('à la génération {}, le nouveau village est {}'.format(ng,reproducteurs))
    Reproscouples=choixDesCouples(reproducteurs)
    print('à la génération {}, les nouveaux reproducteurs sont{}'.format(ng,Reproscouples))
    nouveauVillage=cyclederpro(Reproscouples)
    print('à la génération {}, le nouveau village est{}'.format(ng,nouveauVillage))

    RESULTATS.append(nouveauVillage)
traitementresultats(RESULTATS)

miseenfichiercsv(lista1,lista2,lista3,GEN)

graph(GEN, lista1, lista2, lista3)
print('a1 en bleu, a2 en vert et a3 en rouge')

